<?php
/**
 * 框架入口
 *
 * @version $Id: App.php 90 2013-05-21 08:40:21Z linsir123 $
 * @package Framework
 */
class App
{
	/**
	 * 应用实例
	 *
	 * @var Instance
	 * @static
	 */
	static $I;

	/**
	 * Db前缀
	 */
	const PRE_DB = "Db";

	/**
	 * Model前缀
	 */
	const PRE_MODEL = "Model";

	/**
	 * Helper前缀
	 */
	const PRE_HELPER = "Helper";

	/**
	 * 启动应用程序
	 *
	 * @param string $route 路由信息
	 *
	 * @static
	 */
	static function serve($route = null)
	{
		///
		if (APP_DIR === false)
			die('APP_DIR no defined.');

		///
		self::$I = new Instance();

		///
		self::$I->serve($route);
	}

	/**
	 * 返回[Mysql]对象
	 *
	 * @param int $index 索引
	 *
	 * @return LpMysql
	 * @static
	 */
	static function getMysql($index = 0)
	{
		///
		return self::$I->getStore(1, $index);
	}

	/**
	 * 返回[Redis]对象
	 *
	 * @param int $index 索引
	 *
	 * @return LpRedis
	 * @static
	 */
	static function getRedis($index = 0)
	{
		///
		return self::$I->getStore(2, $index);
	}

	/**
	 * 返回一个组件对象
	 *
	 * @param string $name 组件名
	 * @param bool $internal 从应用或框架处提供
	 * @param string $relative 用于数据分层或归类(经/纬度)
	 * @param string $prefix 用于避免类名重复冲突
	 *
	 * @return mixed
	 * @static
	 */
	static function h($name, $internal = true, $relative = '', $prefix = self::PRE_HELPER)
	{
		///
		return self::$I->getHelper($name, $internal, $relative, $prefix);
	}

	/**
	 * 返回一个模型对象
	 *
	 * @param string $name 模型名
	 * @param int $key 同一个类的某个实例(0则返回某个实例, 非0则为某个单例)
	 * @param string $relative 用于数据分层或归类(经/纬度)
	 * @param string $prefix 用于避免类名重复冲突
	 *
	 * @return mixed
	 * @static
	 */
	static function m($name, $key = 1, $relative = '', $prefix = self::PRE_MODEL)
	{
		///
		return self::$I->getModel($name, $key, $relative, $prefix);
	}

	/**
	 * 返回一个数据表模型对象
	 * // 以单例在应用中进行体现
	 * // 若需要分表则重新配置表名
	 *
	 * @param string $name 模型名
	 * @param string $relative 用于数据分层或归类(经/纬度)
	 * @param string $prefix 用于避免类名重复冲突
	 *
	 * @return mixed
	 * @static
	 */
	static function d($name, $relative = '', $prefix = self::PRE_DB)
	{
		///
		return self::$I->getDb($name, $relative, $prefix);
	}

	/**
	 * 加载第三方插件
	 *
	 * @param string $name 插件名称
	 * @param bool $internal 从应用或框架处提供
	 *
	 * @static
	 */
	static function v($name, $internal = true)
	{
		///
		$file = sprintf("Vendor/%s.php", $name);
		$dir = $internal ? BASE_DIR : APP_DIR;

		///
		Load::import($file, $dir);
	}

	/**
	 * 获取配置信息
	 *
	 * @param string $key 选项的键值
	 * @param string $package 包名
	 *
	 * @return mixed
	 * @static
	 */
	static function o($key, $package = null)
	{
		///
		return self::$I->getConfig()->get($key, $package);
	}
}
